package com.store.controller;

import com.store.entity.User;
import com.store.service.IUserService;
import com.store.service.ex.*;
import com.store.util.JsonResult;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;


import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author cai
 * @since 2022-07-09
 */
@RestController
@RequestMapping("users")
public class UserController extends BaseController{
    @Autowired
    private IUserService userService;

    @RequestMapping("reg")
    public JsonResult<Void> reg(User user){
        // 调用业务对象执行注册
        userService.addUser(user);
        // 返回成功
        return new JsonResult<>(OK);
    }

    @RequestMapping("login")
    public JsonResult<User> login(String username, String password, HttpSession session){
        // 调用业务对象执行登录
        User user=userService.Login(username,password);
        //session存储用户uid,username
        session.setAttribute("uid",user.getUid());
        session.setAttribute("username",user.getUsername());
        //响应结果返回
        return new JsonResult<User>(OK,user);
    }

    @RequestMapping("change_password")
    public JsonResult<Void> changePassword(String oldPassword,String newPassword,HttpSession session){
        // 调用session.getAttribute("")获取uid
        Integer uid= getUidFromSession(session);
        // 调用业务对象执行修改密码
        userService.changePassword(uid,oldPassword,newPassword);
        // 返回成功
        return new JsonResult<Void>(OK);
    }



    @RequestMapping("get_by_uid")
    public JsonResult<User> getUserInfoByUid(HttpSession session){
        // 调用session.getAttribute("")获取uid
        Integer uid= getUidFromSession(session);
        // 调用业务执行获取对象部分信息
        User data= userService.selectInfoByUid(uid);
        // 返回成功
        return new JsonResult<User>(OK,data);
    }

    @RequestMapping("change_info")
    public JsonResult<Void> changeUserInfo(String phone,String email,int gender,HttpSession session){
        // 调用session.getAttribute("")获取uid
        Integer uid= getUidFromSession(session);
        // 调用业务对象执行修改信息
        userService.updateInfoByUid(uid,phone,email,gender);
        // 返回成功
        return new JsonResult<Void>(OK);
    }

    /** 设置上传文件的最大值 */
    public static final int AVATAR_MAX_SIZE=10*1024*1024;

    /** 设置上传文件的类型 */
    public static final List<String> AVATAR_TYPE=new ArrayList<>();

    static {
        AVATAR_TYPE.add("image/jpeg");
        AVATAR_TYPE.add("image/png");
        AVATAR_TYPE.add("image/bmp");
        AVATAR_TYPE.add("image/gif");
    }


    @RequestMapping("change_avatar")
    public JsonResult<String> changeUserAvatar(@RequestParam("file") MultipartFile file, HttpSession session) throws FileUploadException {
        //判空
        if(file.isEmpty()){
            throw new FileEmptyException("文件为空");
        }
        //判断文件是否超出限制
        if (file.getSize()>AVATAR_MAX_SIZE){
            System.out.println(file.getSize());
            throw new FileMaxSizeException("文件超出限制");
        }
        //判断文件是否的符合类型
        String  contentType=file.getContentType();
        //如果不符合预期类型
        if( !AVATAR_TYPE.contains(contentType)){
            System.out.println(contentType);
            throw new FileTypeException("文件类型不支持");
        }
        //上传文件放到 .../upload/文件.png
        String parent=session.getServletContext()
                .getRealPath("upload");
        //判断文件是否存在
        File dir=new File(parent);
        //若没有目录 创建目录
        if ( ! dir.exists()){
            dir.mkdirs();
        }
        //使用UUID生成一个新的字符串作为文件名
        String originalFilename=file.getOriginalFilename();
        System.out.println("原文件名========"+originalFilename);

        // 保存的头像文件的文件名
        String suffix = "";
        int beginIndex = originalFilename.lastIndexOf(".");
        if (beginIndex > 0) {
            suffix = originalFilename.substring(beginIndex);
        }
        String filename = UUID.randomUUID().toString() + suffix;

        // 创建空文件对象，表示保存的头像文件
        File dest = new File(dir, filename);
        // 执行保存头像文件
        try {
            //将file写入空文件中
            file.transferTo(dest);
        } catch (IllegalStateException e) {
            // 抛出异常
            throw new FileStateException("文件状态异常，可能文件已被移动或删除");
        } catch (IOException e) {
            // 抛出异常
            throw new FileUploadException("上传文件时读写错误，请稍后重尝试");
        }

        // 头像路径
        String avatar = "/upload/" + filename;
        System.out.println("文件路径+++"+avatar);
        // 调用session.getAttribute("")获取uid
        Integer uid = getUidFromSession(session);
        // 调用业务对象将头像写入到数据库中
        userService.upAvatar(uid,avatar);

        // 返回成功头像路径
        return new JsonResult<String>(OK, avatar);
    }
}
